package com.sakiko.chat_image.controller;

import dev.langchain4j.data.message.ImageContent;
import dev.langchain4j.data.message.TextContent;
import dev.langchain4j.model.chat.ChatModel;
import dev.langchain4j.model.chat.listener.ChatModelListener;
import dev.langchain4j.model.chat.response.ChatResponse;
import lombok.extern.slf4j.Slf4j;
import dev.langchain4j.data.message.UserMessage;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.core.io.Resource;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

import java.io.IOException;
import java.util.Base64;

/**
 * projectName: com.sakiko.chat_image.controller
 *
 * @author: sakiko
 * time: 2025/8/24 14:07
 * description: https://docs.langchain4j.dev/tutorials/chat-and-language-models/#multimodality
 */
@RestController
@Slf4j
public class ImageModelController {

    @Autowired
    private ChatModel chatModel;

    @Value("classpath:static/images/mi.jpg")
    private Resource resource;

    /**
     * 通过 Base64编码将图片转化为字符串
     * 结合 ImageContent和 TextContent形成 UserMessage一起发送到模型进行处理。
     * <p>
     * 测试: http://localhost:9006/image/read
     */
    @GetMapping("image/read")
    private String ReadImageContent() throws IOException {
        //第一步，图片转码：通过Base64编码将图片转化为字符串
        byte[] content = resource.getContentAsByteArray();
        String base64Data = Base64.getEncoder().encodeToString(content);

        //第二步，提示词指定：结合ImageContent和TextContent一起发送到模型进行处理。
        UserMessage userMessage = UserMessage.from(
                TextContent.from("从下面图片中获取来源名称、股价走势、5月30日股价"),
                ImageContent.from(base64Data, "image/jpg")
        );

        //第三步，API调用：使用OpenAiChatModel来构建请求，并通过chat()方法调用模型。
        //请求内容包括文本提示和图片，模型会根据输入返回分析结果。
        ChatResponse chatResponse = chatModel.chat(userMessage);

        //第四步，解析与输出：从ChatResponse中获取AI大模型的回复，打印出处理后的结果。
        String res = chatResponse.aiMessage().text();

        //后台打印
        System.out.println("res = " + res);

        //返回前台
        return res;
    }
}
